10. Pipelining – MIPS Implementation

流水线——MIPS 实现
AP SHANTHI博士

 

本模块的目标是讨论流水线的基础知识并讨论 MIPS 流水线的实现。

 

在上一个模块中,我们讨论了单循环实现的缺点。我们观察到最长的延迟决定了时钟周期,对于不同的指令改变周期是不可行的。这违反了使普通案例快速的设计原则。克服这个问题的一种方法是采用流水线实现。我们现在将讨论流水线的基础知识。流水线是在计算机系统中组织并行活动的一种特别有效的方式。基本思想非常简单。它在制造工厂中经常遇到,在那里流水线通常被称为装配线操作。通过在装配线上布置生产过程,可以同时处理不同阶段的产品。你一定注意到,在汽车装配线上,你会发现当另一辆车的车门修好而另一辆车的车身正在喷漆时,一辆汽车的底盘将被安装。所有这些都是独立的活动,同时进行。这个过程也被称为流水线,因为就像在流水线中一样,新的输入在一端被接受,之前接受的输入在另一端显示为输出。作为另一个现实世界的例子,考虑洗衣服的情况。假设 Ann、Brian、Cathy 和 Daveeach 有一批衣服要洗涤、烘干和折叠,洗衣机需要 30 分钟,烘干机需要 40 分钟,文件夹需要 20 分钟。连续洗涤 4 次需要 6 小时。另一方面,如果他们学会了流水线,洗衣服需要多长时间?4次加载仅需3.5小时!对于四个负载,您会得到加速比 = 6/3.5 = 1.7。

 

为了在流水线中应用指令执行的概念,需要将指令执行分解为不同的任务。每个任务都将在 CPU 的不同处理单元中执行。众所周知,指令执行有两个不同的阶段:一个是指令提取,另一个是指令执行。因此,处理器通过依次获取和执行指令来执行程序。指令流水线的循环时间 τ 是将一组指令通过流水线推进一级所需的时间。循环时间可以确定为

 


 

其中 τm = 最大阶段延迟(通过经历最大延迟的阶段的延迟),k = 指令流水线中的阶段数,d = 将信号和数据从一个阶段推进到下一个阶段所需的锁存器的时间延迟 。现在假设处理了n条指令,并且这些指令一条接一条地执行。Tk 执行所有n条指令所需的总时间为

 


 

一般来说,让指令执行分为取指、译码、执行、内存访问和回写五个阶段,分别用Fi、Di、Ei、Mi和Wi表示。程序的执行由这些步骤的序列组成。当第一条指令的解码发生时,第二条指令的取指就完成了。当管道被填满时,您会看到有五个不同的活动同时进行。所有这些活动都是重叠的。五个指令在任何给定时间都在进行中。这意味着需要五个不同的硬件单元。这些单位必须能够同时执行其任务且互不干扰。信息通过存储缓冲区从一个单元传递到下一个单元。当一条指令通过管道时,

 

如果所有阶段都是平衡的,即所有阶段都花费相同的时间,

 


如果阶段不平衡,加速会更小。观察到加速是由于吞吐量增加而延迟(每条指令的时间)没有减少。

 

流水线的基本特征是:

 

• 流水线不会帮助单个任务的延迟,它只会帮助整个工作负载的吞吐量

• 流水线速率受最慢流水线阶段的限制

• 多个任务同时运行

• 它利用顺序指令流中指令之间的并行性

• 管道级的不平衡长度降低了加速比

• “填充”管道的时间和“排空”的时间会降低加速

• 理想情况下,加速比等于阶段数且 CPI 为 1

 

让我们考虑具有五个阶段的 MIPS 流水线,每个阶段一个步骤:

 

• IF:从内存中取指令

• ID:指令解码和寄存器读取

• EX:执行操作或计算地址

• MEM:访问内存操作数

• WB:将结果写回寄存器

 

考虑图 10.1 中给出的细节。假设寄存器读取或写入需要 100ps,所有其他阶段需要 200ps。让我们计算通过流水线获得的加速比。


 


图 10.2

 

对于非流水线实现,每条指令需要 800ps,而对于流水线实现,它只需要 200ps。

 

请注意,MIPS ISA 的设计方式使其适用于流水线。

 

图 10.3 显示了 MIPS 流水线的实现。

 

– 所有指令均为 32 位

更容易在一个周期内获取和解码
相比之下,x86 ISA:1 到 17 字节指令
– 很少有规律的指令格式

可以一步解码和读取寄存器
– 加载/存储寻址

可以在第 3 阶段计算地址,在第 4 阶段访问内存
– 内存操作数的对齐

内存访问只需要一个周期


 

图 10.4 显示了如何在阶段之间引入缓冲区。这是强制性的。每个阶段从该缓冲区接收数据,对其进行处理并写入下一个缓冲区。另请注意,当一条指令从一个缓冲区沿管道向下移动到下一个缓冲区时,其相关信息也随之移动。例如,在时钟周期 4 期间,缓冲区中的信息如下:

 

缓冲区 IF/ID 保存指令 I4,该指令在周期 4 中获取
缓冲区 ID/EX 保存解码指令和指令 I3 的两个源操作数。这是解码硬件在周期 3 中产生的信息。
缓冲区 EX/MEM 保存 I2 的执行结果。缓冲区还保存指令 I2 的写步骤所需的信息。即使执行阶段不需要它,该信息也必须传递到下一个阶段,并在接下来的时钟周期中进一步向下传递到回写阶段,以使该阶段能够执行所需的写操作。
缓冲区 MEM/WB 保存从内存中取出的数据(用于加载)供 I1 使用,对于算术和逻辑运算,执行单元产生的结果和指令 I1 的目标信息只是传递。
我们将查看 MIPS ISA 的加载和存储指令的单时钟周期图。图 10.4 显示了加载/存储指令的指令提取。观察到PC 是用来取指令的,它被写入IF/ID 缓冲区,PC 递增4。图10.5 显示了ID 的下一阶段。指令被解码,寄存器文件被读取,操作数被写入 ID/EX 缓冲区。请注意,包括目标寄存器在内的指令的全部信息都被写入 ID/EX 缓冲区。图中的高亮部分显示了所涉及的资源。图 10.6 显示了执行阶段。基址寄存器的内容和符号扩展位移被送入 ALU,加法运算开始,ALU 计算内存地址。该有效地址存储在 EX/MEM 缓冲区中。目标寄存器的信息也从 ID/EX 缓冲区传递到 EX/MEM 缓冲区。接下来,内存访问发生,读取的数据写入 MEM/WB 缓冲区。目标寄存器的信息从 EX/MEM 缓冲区传递到 MEM/WB 缓冲区。如图 10.7 所示。回写发生在最后一个阶段。从数据存储器读取的数据写入指令中指定的目标寄存器。如图 10.8 所示。目标寄存器信息与要写入的数据一起从 MEM/WB 存储器向后传递到寄存器文件。数据路径如图 10.9 所示。

 







对于存储指令,有效地址计算与加载相同。但是当涉及到内存访问阶段时,store 会执行内存写入。有效地址从执行阶段传递到内存阶段,从寄存器文件读取的数据从 ID/EX 缓冲区传递到 EX/MEM 缓冲区并从那里获取。存储指令完成此存储阶段。存储指令没有回写。

 

在讨论通过流水线数据路径的逐周期指令流时,我们可以查看以下选项:

 

 “单时钟周期”流水线图
显示单个周期中的管道使用情况
突出显示使用的资源
o “多时钟周期”图
一段时间内的操作图
 

显示资源利用率的多时钟周期流水线图如图 10.10 所示。可以看出,eth第一阶段使用了指令存储器,第二阶段使用了寄存器文件,第三阶段使用了ALU,第四阶段使用了数据存储器,第五阶段再次使用了寄存器文件。

 


图 10.11

 

图 10.11 给出了显示每个时钟周期中发生的活动的多周期图。

 

现在,在讨论了 MIPS 架构的流水线实现之后,我们需要讨论控制信号的生成。MIPS 的流水线实现以及控制信号在图 10.12 中给出。

 


并非同时需要指示的所有控制信号。流水线的不同阶段需要不同的控制信号。但是有关生成各种控制信号的决定是在指令被解码时的第二阶段完成的。因此,正如当指令从一个阶段移动到另一阶段时数据从一个阶段流向另一阶段一样,控制信号也从一个缓冲区传递到另一个缓冲区,并在适当的时刻被利用。如图 10.13 所示。执行阶段的控制信号用于该阶段。内存阶段和回写阶段所需的控制信号与该指令一起移动到下一个阶段。与存储器相关的控制信号用于下一阶段,而,

 


完整的流水线实现以及在各个阶段使用的控制信号如图 10.14 所示。

 


总而言之,我们已经在本模块中讨论了流水线的基础知识。我们对流水线进行了以下观察。

流水线是指令的重叠执行
延迟相同,但吞吐量提高
管道速率受最慢管道阶段的限制
潜在加速比 = 管道级数
 

我们已经讨论了 MIPS 架构中流水线的实现。我们已经展示了各种缓冲区的实现、数据流和 MIPS 架构的流水线实现的控制流。

 

网页链接/支持材料

计算机组织与设计——硬件/软件接口,David A. Patterson 和 John L. Hennessy,第 4 版,Morgan Kaufmann,Elsevier,2009 年。
计算机组织,Carl Hamacher、Zvonko Vranesic 和 Safwat Zaky,第 5 版,McGraw-Hill 高等教育,2011 年。